#ifndef ENCODEVIDEO_H
#define ENCODEVIDEO_H

#include <QDebug>

#include <QThread>
#include <QQueue>
#include <QDateTime>
#include "model/configuremodel.h"
#include "model/videomodel.h"
#include "model/usermodel.h"
#include "model/logmodel.h"

extern "C"  //表明引用C语言的库
{
//    #include “libavcodec/avcodec.h"
    #include "libavcodec/avcodec.h"          //包含了所有的ffmpeg编码器解压器
    #include "libavdevice/avdevice.h"        //输入输出设备操作
    #include "libavfilter/avfilter.h"       //提供一个机制，各种的过滤（滤镜）处理
    #include "libavformat/avformat.h"       //包含处理多媒体各种不同的格式
    #include "libavutil/avutil.h"           //工具性质的函数--加密解密 数据格式转换等
    #include "libpostproc/postprocess.h"    //多媒体操作多任务处理函数
    #include "libswresample/swresample.h"   //音频操作
    #include "libswscale/swscale.h"         //只针对图像数据   缩放、像素格式转换
}


class EncodeVideo : public QThread
{
    Q_OBJECT
public:
    EncodeVideo();
    void initData();
    void encodeFrame();
    void writeTalier();

    bool getIsStop() const;
    void setIsStop(bool value);

    bool getIsRun() const;
    void setIsRun(bool value);

    int getWidth() const;
    void setWidth(int value);

    int getHeight() const;
    void setHeight(int value);


    QQueue<AVFrame*> queue;

    //公共的路径位置，编码在保存封面的时候就可以写入
    QString videoPath;

private:
    AVFormatContext * formatContext;    //文件上下文
    AVCodecContext * codecContext;      //编码上下文
    AVPacket * pkt;
    AVOutputFormat *format;
    AVStream *stream;
    AVCodec *codec;
    int pktIndex;

    //是否暂停、结束
    bool isRun;
    bool isStop;
    int video_index;

    int count;
    int current;
    QString filename, datetime;

    int width;
    int height;


//     QThread interface
protected:
    void run();

signals:
    void makeHeadTalier(QString);
};

#endif // ENCODEVIDEO_H
